package app;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import test.DatosPruebaCPR;
import xmlparsers.SystemParser;
import app.dto.DetalleItemDto;
import bean.srv.GeneralSRV;
import bean.srv.ListaPreciosSRV;
import bean.srv.OrdenPedidoSRV;
import bean.srv.PaisSRV;
import bean.srv.ProveedorSRV;
import bean.srv.RemitoSRV;
import bean.srv.RodamientosSRV;
import bean.srv.SolicitudCotizacionSRV;
import dominio.*;
import enums.TipoLista;
import exceptions.InsertException;
import exceptions.ModifyException;

public class CPR {

	// private List<ODV> odvs;
	private static CPR instancia;
	private ProveedorSRV provSVR;
	private PaisSRV paisSVR;
	private ListaPreciosSRV listaPreciosSVR;
	private RodamientosSRV rodamientoSVR;
	private SolicitudCotizacionSRV solicitudSRV;
	private GeneralSRV generalSRV;
	private RemitoSRV remitoSRV;
	private OrdenPedidoSRV ordenPedidoSRV;
	
	private CPR() {
		super();

		provSVR = new ProveedorSRV();
		paisSVR = new PaisSRV();
		listaPreciosSVR = new ListaPreciosSRV();
		rodamientoSVR = new RodamientosSRV();
		solicitudSRV = new SolicitudCotizacionSRV();
		generalSRV = new GeneralSRV();
		ordenPedidoSRV = new OrdenPedidoSRV();
		remitoSRV = new RemitoSRV();
	}
	
	public void crearProveedor(String cuit, String razonSocial, String origen) throws InsertException {
		Proveedor prov = new Proveedor();
		prov.setCuit(cuit);
		prov.setRazonSocial(razonSocial);

		Pais paisOrigen = paisSVR.buscarPais(origen);
		prov.setOrigen(paisOrigen);

		provSVR.agregarProveedor(prov);
	}

	// public void modificarProveedor(int cuit, String razonSocial, String
	// origen) {
	// Proveedor prov = new Proveedor();
	// prov.setCuit(cuit);
	// prov.setRazonSocial(razonSocial);
	//
	// Pais paisOrigen = paisSVR.buscarPais("Argentina");
	// prov.setOrigen(paisOrigen);
	//
	// provSVR.agregarProveedor(prov);
	// proveedores.add(prov);
	// }

	public void modificarProveedor(String cuit, String razonSocial,
			String origen) {
		Proveedor prov = provSVR.buscarProveedor(cuit);
		prov.setRazonSocial(razonSocial);
		prov.setOrigen(paisSVR.buscarPais(origen));
		provSVR.modificarProveedor(prov);
	}

	public void eliminarProveedor(String cuit) {
		Proveedor prov = provSVR.buscarProveedor(cuit);
		provSVR.eliminarProveedor(prov);
	}

	public void crearRodamiento(Rodamiento rodamiento) throws InsertException {
		rodamientoSVR.agregarRodamiento(rodamiento);
	}

	public Rodamiento getMismoRodamiento(Rodamiento r) {
		return rodamientoSVR.getMismoRodamiento(r.getNumeroSerie(), r.getSufijo(),
				r.getMarca(), r.getOrigen());
	}

	public void modificarRodamiento(int id, String ns, String s, String m,
			String o, String c, float p, int cant) throws ModifyException {
		rodamientoSVR.modificarRodamiento(id, ns, s, m, o, c, p, cant);

	}
	
	public void eliminarRodamiento(int id) {
		rodamientoSVR.eliminarRodamiento(id);
	}
	
	public void eliminarRodamiento(Rodamiento rodamiento) {
		rodamientoSVR.eliminarRodamiento(rodamiento.getIdRodamiento());
	}

	public void modificarRodamiento(Rodamiento r) throws ModifyException {
		rodamientoSVR.modificarRodamiento(r);

	}

	
	public List<DetalleItemDto> obtenerListaMejoresPrecios(String marca, String carac,
			String origen, String sufijo, String serie, boolean todos) {
		
		return rodamientoSVR.obtenerMejoresPrecios(marca,carac, origen,sufijo, serie, todos);

	}

	public void registrarListaPreciosProveedor(ListaPrecios lista) {

	}

	public void registrarMovimiento(MovimientoStock movimiento) {

	}

	public static CPR getCPR() {
		if (instancia == null) {
			instancia = new CPR();
			
		}
		return instancia;
	}

	public Proveedor loadProveedor(Proveedor prov) {
		return provSVR.loadProveedor(prov);
	}

	public Proveedor buscarProveedor(String cuit) {
		return provSVR.buscarProveedor(cuit);
	}

	public void persistirListaPrecios(String cuitProveedor, int numeroLista,
			String vigenciaDesde, String vigenciaHasta, int reemplazaListaNro,
			TipoLista tipo) {
		Proveedor prov = provSVR.buscarProveedor(cuitProveedor);
		listaPreciosSVR.newListaPrecios(prov, numeroLista, vigenciaDesde,
				vigenciaHasta, reemplazaListaNro, tipo);
	}

	public void persistirItemListaPrecios(int idRodamiento, int stock,
			BigDecimal precio, int idLista) {
		Rodamiento rodamiento = rodamientoSVR.getRodamiento(idRodamiento);
		ListaPrecios lista = listaPreciosSVR.getListaPrecios(idLista);

		ItemListaPrecios itemLista = new ItemListaPrecios();
		// itemLista.setRodamiento(rodamiento);

		listaPreciosSVR.agregarItemListaPrecios(lista, itemLista);
	}

	public List<ItemComparativaPrecio> obtenerComparativaPrecios() {
		List<ItemComparativaPrecio> resultado = new ArrayList<ItemComparativaPrecio>();

		return resultado;
	}

	public void persistirListaPrecios(String path) {
		ListaPrecios lp = SystemParser.getInstance().parseListasPrecios(
				"xmls/lista_precios_datos.xml");
		listaPreciosSVR.newListaPrecios(lp);
	}

	public List<Rodamiento> listarRodamientos(String codigo,
			String serie, String marca, String carac, String origen) {

		return rodamientoSVR.listarRodamientos(codigo,serie,marca,carac,origen);
	}

	public void agregarItemSolicitud(ItemSolicitud item) {

		solicitudSRV.agregaritemSolicitud(item);		
	}

	public FormaPago getFormaPago(String tipo) 
	{
		return generalSRV.getFormaPagoByTipo(tipo);		
	}
	
	public Remito generarRemito (OrdenPedido op, Date fecha,int numero) {
		Remito remi = null;
		if (op != null)
		{
			System.out.println("Cliente:" + op.getCliente().getRazonSocial() + ", OP: "+ op.getOrdenPedidoId() + ", Fecha: " + fecha);
			
			remi = new Remito ();
			remi.setOrdenPedido(op);
			remi.setCliente(op.getCliente());
			remi.setNumero(numero);
			remi.setFechaEmision(fecha);
			remi.setEstado("pendiente");
			remitoSRV.crearRemito(remi);
		}
		
		return remi;
	}

	public List<Factura> facturar() {

		System.out.println("Obteniendo cotizaciones");
		List<Cotizacion> cotizaciones = Odv.getinstancia().obtenerCotizaciones();
		
		List<Factura> facturas = new ArrayList<Factura>();

		for(Cotizacion c: cotizaciones)
		{
			if(c.getSolicitudCotizacion() == null)
			{
				continue;
			}
			
			OrdenPedido op = new OrdenPedido();
			op.setCotizacion(c);
			op.setCliente(c.getSolicitudCotizacion().getCliente());
			op.setEstado("pendiente");
			op.setFecha(new Date());
			op.setNumero(c.getNumero());
			
			List<ItemPedido> itemsPedido = new ArrayList<ItemPedido>();
			
			List<ItemSolicitud> itemsSolicitud = c.getSolicitudCotizacion().getItems();
			System.out.println("Items Solicitud obtenidos" + itemsSolicitud.size());
			
			for(ItemSolicitud it:itemsSolicitud)
			{
				if(it.getItemLista() != null)
				{
					ItemPedido item = new ItemPedido();				
					item.setCantidad(it.getCantidad());
					item.setCodigo(it.getRodamiento().getSufijo());
					item.setMarca(it.getRodamiento().getMarca());
					item.setOrigen(CPR.getCPR().buscarPais(it.getRodamiento().getOrigen()));
					item.setPrecio(it.getItemLista().getPrecio());
					item.setSerie(it.getRodamiento().getNumeroSerie());
					item.setSufijo(it.getRodamiento().getSufijo());
					itemsPedido.add(item);
				}
			}			
			
			OrdenPedido ordenGenerada = Odv.getinstancia().crearOrdenPedido(op);
			System.out.println("Se creo la orden de pedido #" + ordenGenerada.getNumero());
			
			System.out.println("Creando remito #" +op.getNumero());
			generarRemito(ordenGenerada,ordenGenerada.getFecha(),ordenGenerada.getNumero());
			
			Odv.getinstancia().generarFacturas();
			
			facturas = Odv.getinstancia().listarFacturas();
		}
		
		return facturas;
	}

	private Pais buscarPais(String origen) {
		
		return paisSVR.buscarPais(origen);
	}
}
